<?php
/**
 * @title 1567. 乘积为正数的最长子数组长度 - 归并
 * @author start2004
 */

// ini_set("memory_limit", "128M");

// class Solution {
//
//     function find() {
//
//     }
// }

class Solution {

    /**
     * @param Integer[] $nums
     * @return Integer
     */
    function getMaxLen($nums) {
        /**
         * @since 2020-10-16 数组长度
         */
        $len = count($nums);

        /**
         * @since 2020-10-16 分类数组
         */
        $groupArray = [];

        /**
         * @since 2020-10-16 归类统计
         */
        $symbol = $count = 0;

        /**
         * @since 2020-10-16 分类
         */
        $tmpArray = [];
        for($i=0; $i<$len; $i++){
            if($nums[$i] == 0){
                if($count > 0){
                    /**
                     * @since 2020-10-16 收官再初始化
                     */
                    $tmpArray[] = [$symbol, $count];
                    $groupArray[] = $tmpArray;
                }

                $tmpArray = [];
                $symbol = $count = 0;
            } else {
                /**
                 * @since 2020-10-16 正负化
                 */
                if($nums[$i] > 0){
                    $s = 1;
                } else {
                    $s = -1;
                }

                /**
                 * @since 2020-10-16 相同, count++
                 */
                if($symbol == $s){
                    $count++;
                } else {
                    /**
                     * @since 2020-10-16 区间统计结束
                     */
                    if($count > 0){
                        $tmpArray[] = [$symbol, $count];
                    } else {}

                    /**
                     * @since 2020-10-16 新的起点
                     */
                    $symbol = $s;
                    $count = 1;
                }
            }
        }

        /**
         * @since 2020-10-16 收官
         */
        if($count > 0){
            $tmpArray[] = [$symbol, $count];
            $groupArray[] = $tmpArray;
        } else {}
        // return $groupArray;

        /**
         * @since 2020-10-16 递归求最大值
         */
        $max = 0;
        foreach ($groupArray as $gArray){
            $max = max($max, self::find($gArray));
        }

        /**
         * @return
         */
        return $max;
    }

    /**
     * @title 返回乘积正数最大长度
     * @author start2004
     * @since 2020-10-16 Created
     *
     * @param $nums
     */
    public function find($nums){
        /**
         * @since 2020-10-16 最大长度
         */
        $max = 0;

        /**
         * @since 2020-10-16 数组长度
         */
        $len = count($nums);
        // var_dump($nums);die();

        /**
         * @since 2020-10-16 处理负数是偶数的
         */
        $datas = [];
        $j = 0;
        for($i=0; $i<$len; $i++, $j++){
            /**
             * @since 2020-10-16 正数直接进
             */
            if($nums[$i][0] == 1){
                $datas[] = $nums[$i];
            } else {
                /**
                 * @since 2020-10-16 负数如果偶数, 合并
                 */
                if($nums[$i][1] % 2 == 0){
                    if($j == 0){
                        /**
                         * @since 2020-10-16 不存在上一个正数
                         */
                        if($len == 1){
                            /**
                             * @since 2020-10-16 不存在下一个正数
                             */
                            $datas[] = [1, $nums[0][1]];
                        } else {
                            /**
                             * @since 2020-10-16 存在下一个正数
                             */
                            $datas[] = [1, $nums[0][1] + $nums[1][1]];
                            $i++;
                        }
                    } else {
                        /**
                         * @since 2020-10-16 存在上一个正数
                         * @since 2020-10-16 存在下一个正数
                         */
                        if($i <= $len-2){
                            $datas[$j-1][1] += $nums[$i][1]+$nums[$i+1][1];
                            $i++;
                        } else {
                            /**
                             * @since 2020-10-16 不存在下一个数
                             */
                            $datas[$j-1][1] += $nums[$i][1];
                        }
                        $j--;
                    }
                } else {
                    $datas[] = $nums[$i];
                }
            }
        }
        // var_dump($datas);die();

        /**
         * @since 2020-10-16 目前字符串负数的数量是奇数
         * @since 2020-10-16 合并`正1 + 负2 + 正3 + 负4 + 正5` = 正
         */
        $len = count($datas);
        if($datas[0][0] == -1){
            $i = 0;
        } else {
            $i = 1;
        }
        for(; $i<$len; $i+=4){
            if(isset($datas[$i]) AND isset($datas[$i+2])){
                /**
                 * @since 2020-10-16 合并 负2+正3+负4
                 */
                $count = $datas[$i][1] + $datas[$i+1][1] + $datas[$i+2][1];

                /**
                 * @since 2020-10-16 正1, 正5是否存在
                 */
                if(isset($datas[$i-1])){
                    $count += $datas[$i-1][1];
                } else {}
                if(isset($datas[$i+3])){
                    $count += $datas[$i+3][1];
                }

                /**
                 * @since 2020-10-16 正5位置赋值, 即使不存在, 也break
                 */
                $datas[$i+3] = [1, $count];

                /**
                 * @since 2020-10-16 删除正1 + 负2 + 正3 + 负4
                 */
                unset($datas[$i-1], $datas[$i], $datas[$i+1], $datas[$i+2]);
            } else {
                break;
            }
        }

        /**
         * @since 2020-10-16 格式化
         */
        $nums = array_values($datas);
        $len = count($nums);

        /**
         * @since 2020-10-16 只有1个区间段
         */
        if($len == 1){
            /**
             * @since 2020-10-16 全是正数
             */
            if($nums[0][0] == 1){
                $max = $nums[0][1];
            } else {
                /**
                 * @since 2020-10-16 全是负数, count(负)是奇数
                 */
                $max = $nums[0][1]-1;
            }
        } elseif($len == 2) {
            /**
             * @since 2020-10-16 2个区间段, 正+负, 负+正
             * @since 2020-10-16 count(负)是奇数
             */
            $max = $nums[0][1] + $nums[1][1]-1;
        } elseif($len == 3) {
            /**
             * @since 2020-10-16 3个区间段, 只有正+负+正, 不会出现`负+正+负`已经合并
             * @since 2020-10-16 count(负)是奇数
             */
            $max = max($nums[0][1], $nums[2][1]) + $nums[1][1]-1;
        }

        /**
         * @return
         */
        return $max;
    }
}

/**
 * @url http://127.0.0.1/leetcode/202010/2020.10.16_4.php
 */
$datas = [
    // [[1,-2,-3,4],], // 4
    // [[0,1,-2,-3,-4],], // 3
    // [[-1,-2,-3,0,1],], // 2
    // [[-1,2],], // 1
    // [[1,2,3,5,-6,4,0,10],], // 4
    [[-17,-9,17,-3,-5,-13,2,6,0],], // 7
];

include_once dirname(__DIR__) . DIRECTORY_SEPARATOR ."xhprof.php";
$xhprof = new Xhprof();
foreach ($datas as $data){
    var_dump($data);

    $obj = new Solution();
    $result = $obj->getMaxLen(...$data);
    // $result = $obj->($xhprof->tree($data));
    // $result = $obj->($xhprof->listNode($data));
    // $result = $obj->find(...$data);
    var_dump($result);
    // if(count($result)<=20){
    //     var_dump($result);
    // } else {
    //     var_dump(count($result));
    // }
    echo str_repeat("<br>", 3);
    echo str_repeat(PHP_EOL, 3);
}

// foreach ($datas as $data){
//     $obj = new $data[0][0](...$data[1][0]);
//
//     for ($i=1; $i<count($data[0]); $i++){
//         $result = $obj->$data[0][$i](...$data[1][$i]);
//
//         echo $data[0][$i] ."(\"". implode(",", $data[1][$i]) ."\") ";
//             if($result === true){
//                 echo "True";
//             } elseif($result === false) {
//                 echo "False";
//             } elseif($result === null) {
//                 echo "Null";
//             } elseif(is_array($result)) {
//                 var_dump($result);
//             } else {
//                 echo $result;
//             }
//         echo PHP_EOL;
//     }
//
//     echo str_repeat(PHP_EOL, 3);
// }
$xhprof->end();
